import axios from 'axios'
import { Message, Loading } from 'element-ui'
import Qs from 'qs'
import jsCookie from 'js-cookie'

// 初始化loading
let loading

// 开始加载动画
function startLoading () {
  loading = Loading.service({
    lock: true,
    text: '拼命加载中...'
  })
}
// 结束加载动画
function endLoading () {
  loading.close()
}

axios.defaults.baseURL = 'http://127.0.0.1:8888/api/private/v1/'
// 设置默认的请求超时时间
axios.defaults.timeout = 20000
// post请求头的设置
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'

// 拦截器 在请求或响应被 then 或 catch 处理前拦截它们
// 请求拦截器
axios.interceptors.request.use(
  config => {
    // 在发送请求之前做些什么
    // 每次发送请求之前判断是否存在token，如果存在，则统一在http请求的header都加上token，不用每次请求都手动添加了
    // 即使本地存在token，也有可能token是过期的，所以在响应拦截器中要对返回状态进行判断
    const token = jsCookie.get('token')
    config.headers.Authorization = token
    startLoading()
    return config
  },
  // 对请求错误做些什么
  error => {
    setTimeout(() => {
      endLoading()
      Message.error('请求超时了，请刷新重试！！！')
    }, 20000)
    return Promise.error(error)
  }
)

// 响应拦截器
axios.interceptors.response.use(
  // 对响应数据做点什么
  response => {
    if (response.status === 200) {
      endLoading()
      return Promise.resolve(response)
    } else {
      endLoading()
      return Promise.reject(response)
    }
  },
  // 对响应错误做点什么
  error => {
    endLoading()
    return Promise.reject(error)
  }
)

export function HAjax (url = '', params = {}, method = 'get', type = '') {
  url = axios.defaults.baseURL + url

  if (method.toLowerCase() === 'get' || method.toLowerCase() === 'delete') {
    let query = []
    for (const key in params) {
      const value = params[key] !== undefined ? params[key] : ''
      query.push(key + '=' + value)
    }
    query = query.join('&')
    url += (url.indexOf('?') < 0 ? '?' : '&') + query
  }
  /**
   * Qs.stringify(params)提交方式就是formData
   */
  if (method.toLowerCase() === 'post' && type === 'formData') {
    params = Qs.stringify(params)
  }
  return new Promise((resolve, reject) => {
    axios({ method: method, url: url, data: params }).then(response => {
      resolve(response.data)
    }).catch(error => {
      Message.error(error.data.meta.msg)
      reject(error)
    })
  })
}
